Amazon RDS for MySQL 8.0のデフォルト認証プラグインはmysql_native_password
MySQL 8.0 になって、デフォルトのユーザー認証方式が新規に導入された caching_sha2_password に変わりました。
クライアント(libmysqlclient)も caching_sha2_password に対応した 5.7.23 以降 または 8.0 系である必要があるため、接続エラーをきっかけにこの仕様変更を知り、デフォルトの認証方式を mysql_native_password に変更して乗り切っている方も多いようです。
一方で Amazon RDS for MySQL 8.0 のデフォルトのユーザー認証は mysql_native_password のままのため、特別な対応は不要です。
今回は
- MySQL のデフォルトのユーザー認証方式の確認方法
caching_sha2_password
での接続方法
を調べたので、共有します。
Amazon RDS for MySQL 8.0 のデフォルト認証プラグインはmysql_native_passwordのまま
Amazon RDS for MySQL 8.0 のデフォルトのパラメータグループ「default.mysql8.0」のパラメータ default_authentication_plugin を確認すると
- mysql_native_password
- Modifiable : false
となっていました。
つまり、デフォルトの認証方式はこれまでと同じ mysql_native_password
のままで、デフォルト値を変えることもできません。
Amazon RDS for MySQL 8.0 を作成し、サーバーに接続して実際に確認します。
mysql> show variables like 'default_authentication_plugin'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | mysql_native_password | +-------------------------------+-----------------------+ 1 row in set (0.01 sec) mysql> SELECT user, host, plugin FROM mysql.user; +------------------+-----------+-----------------------+ | user | host | plugin | +------------------+-----------+-----------------------+ | username | % | mysql_native_password | | mysql.infoschema | localhost | mysql_native_password | | mysql.session | localhost | mysql_native_password | | mysql.sys | localhost | mysql_native_password | | rdsadmin | localhost | mysql_native_password | +------------------+-----------+-----------------------+ 5 rows in set (0.00 sec)
確かにデフォルトの認証プラグインは mysql_native_password で、初期ユーザーの認証プラグインも mysql_native_password です。
caching_sha2_password 認証してみる
認証プラグインに caching_sha2_password を利用するユーザーを作成し、認証してみます。
caching_sha2_password 認証のユーザーを作成
認証プラグインはユーザーごとに個別に設定可能です。
試しに caching_sha2_password 認証を利用するユーザーを作成します。
IDENTIFIED WITH caching_sha2_password
を明示的に指定します。
mysql> CREATE USER caching_sha2 IDENTIFIED WITH caching_sha2_password by 'password'; Query OK, 0 rows affected (0.07 sec) mysql> SELECT user, host, plugin FROM mysql.user where user = 'caching_sha2'; +--------------+------+-----------------------+ | user | host | plugin | +--------------+------+-----------------------+ | caching_sha2 | % | caching_sha2_password | +--------------+------+-----------------------+ 1 row in set (0.00 sec)
caching_sha2_password 認証の通信要件
caching_sha2_password 認証は、名前の通り、認証結果をキャッシュします。
初回接続時のようにキャッシュがない場合、 SSL 通信または RSA 暗号によるパスワードの交換が必要です。SSL 通信方式の方が推奨されています。
認証情報がいったんキャシュされると、チャレンジ・レスポンススタイルの高速な認証が行われます。
※図は「MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password」から
以下ではキャッシュがない前提での caching_sha2_password 認証を試します。
準備:MySQL クライアントのバージョンを上げる
caching_sha2_password 認証に絡むハンドシェイクのクライアント処理はライブラリ libmysqlclient が担っています。
MySQL 8.0 より古いクライアント(libmysqlclient)は caching_sha2_password に対応していないため、caching_sha2_password 認証を試みると、以下の様なエラーが発生します。
$ mysql -h HOST -u caching_sha2 -p Enter password: ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
MySQL クライアントを
- 5.7.23 以降
- 8.0 系
にアップグレードしてください。
In MySQL 5.7, the default authentication plugin is mysql_native_password. As of MySQL 8.0, the default authentication plugin is changed to caching_sha2_password. To enable MySQL 5.7 clients to connect to 8.0 and higher servers using accounts that authenticate with caching_sha2_password, the MySQL 5.7 client library and client programs now support the caching_sha2_password client-side authentication plugin. This improves MySQL 5.7 client connect-capability compatibility with respect to MySQL 8.0 and higher servers, despite the differences in default authentication plugin. For more information, see Caching SHA-2 Pluggable Authentication.
https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-23.html#mysqld-5-7-23-security
5.7系でも対応していることをご指摘いただきました。
> MySQL 8.0 より古いクライアント(libmysqlclient)は caching_sha2_password に対応していないため、caching_sha2_password 認証を試みると、以下の様なエラーが発生します。
MySQL 5.7.23とそれ以降ではMySQL 5.7のクライアントでも対応しましたよーhttps://t.co/H1aefENxIl
— yoku0825 (@yoku0825) November 20, 2018
SSL 通信を試す
mysql コマンドは、デフォルトで SSL 通信を試し、 RDS インスタンスも SSL 通信に対応しています。
そのため、特別なオプションを与えることなく接続しても、 caching_sha2_password 認証できます。
$ mysql -h $HOST -u caching_sha2 -p Enter password: ... mysql>
非 SSL 通信を試す
SSL 通信しないオプションを渡し(--ssl-mode=DISABLED
)、サーバーに接続してみます。
$ mysql --ssl-mode=DISABLED -h $HOST -u caching_sha2 -p Enter password: ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
"Authentication requires secure connection." というエラーが発生しました。
非 SSL 通信で RSA 暗号を試す
非 SSL 通信であっても、RSA 暗号方式でセキュアにパスワード交換すれば caching_sha2_password 認証できます。
RDS for MySQL はこの方式にも対応しています。
- サーバー接続時に公開鍵を要求
- サーバー接続時に公開鍵を送信
の2方式があります。
1. サーバーに公開鍵を要求
サーバー接続時に --get-server-public-key
オプションを渡すと、RSA 暗号用の公開鍵をサーバーに要求できます。
オンデマンドで取得した公開鍵を利用して RSA 暗号します。
$ mysql --ssl-mode=DISABLED -h $HOST -u caching_sha2 -p \ --get-server-public-key Enter password: ... mysql>
2. クライアントから公開鍵を送信
RSA 暗号用の公開鍵をクライアントに事前配布可能な場合、サーバー接続時にその公開鍵を渡す事もできます。
RDS for MySQL では、公開鍵は STATUS
コマンド結果から確認できます。
mysql> SHOW GLOBAL STATUS LIKE '%RSA%' \G *************************** 1. row *************************** Variable_name: Caching_sha2_password_rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXFdHu/ESnkK27hfRoKS BL0NDwC22AYE8UIHGXc02rB+5/F9uBbCxHnN7gRzZSa3AXHRIMHFSZUspBZhU+8M xDrq7TIjXchloRVSMJSIl2RMN/dDGPZqDfrmGlqvqlRoQEXLn6VcUG3Gm9gO2iq6 2lv40jhFfKhAJPgHnojqoycaSx4mI4FC4LS7NZY3+IXUL+rliICgf9B4xps4WJ4C Skhv75pjY/eNfDt9cBGQh0XjtpyhjmxJ1uDInwIvhxkA6SK+1oEXDnYjOp662TzH 9XUKaAb/40qhsV/jrBsrT0CHQ1XKeXoQK5HoIQvLrbg1Ae+7OIS/eV+rDMK59t3Z UwIDAQAB -----END PUBLIC KEY----- *************************** 2. row *************************** Variable_name: Rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXFdHu/ESnkK27hfRoKS BL0NDwC22AYE8UIHGXc02rB+5/F9uBbCxHnN7gRzZSa3AXHRIMHFSZUspBZhU+8M xDrq7TIjXchloRVSMJSIl2RMN/dDGPZqDfrmGlqvqlRoQEXLn6VcUG3Gm9gO2iq6 2lv40jhFfKhAJPgHnojqoycaSx4mI4FC4LS7NZY3+IXUL+rliICgf9B4xps4WJ4C Skhv75pjY/eNfDt9cBGQh0XjtpyhjmxJ1uDInwIvhxkA6SK+1oEXDnYjOp662TzH 9XUKaAb/40qhsV/jrBsrT0CHQ1XKeXoQK5HoIQvLrbg1Ae+7OIS/eV+rDMK59t3Z UwIDAQAB -----END PUBLIC KEY----- 2 rows in set (0.00 sec)
Caching_sha2_password_rsa_public_key
は caching_sha2_password 認証Rsa_public_key
は sha256_password 認証
で利用される公開鍵です。
この公開鍵を引数 --server-public-key-path
で渡して接続します。
$ cat Caching_sha2_password_rsa_public_key.pub -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXFdHu/ESnkK27hfRoKS BL0NDwC22AYE8UIHGXc02rB+5/F9uBbCxHnN7gRzZSa3AXHRIMHFSZUspBZhU+8M xDrq7TIjXchloRVSMJSIl2RMN/dDGPZqDfrmGlqvqlRoQEXLn6VcUG3Gm9gO2iq6 2lv40jhFfKhAJPgHnojqoycaSx4mI4FC4LS7NZY3+IXUL+rliICgf9B4xps4WJ4C Skhv75pjY/eNfDt9cBGQh0XjtpyhjmxJ1uDInwIvhxkA6SK+1oEXDnYjOp662TzH 9XUKaAb/40qhsV/jrBsrT0CHQ1XKeXoQK5HoIQvLrbg1Ae+7OIS/eV+rDMK59t3Z UwIDAQAB -----END PUBLIC KEY----- $ mysql --ssl-mode=DISABLED -h $HOST -u caching_sha2 -p \ --server-public-key-path=Caching_sha2_password_rsa_public_key.pub ... mysql>
無事接続できました。
認証プラグインを変更する
ユーザーの認証プラグインを変更することもできます。
次の SQL 文は、ユーザー「user」の認証プラグインを「caching_sha2_password」に変更し、そのパスワードを「password」に変更します。
mysql> ALTER USER user IDENTIFIED WITH caching_sha2_password BY 'password';
認証方式によってソルトの管理が異なったりするため、認証方式だけでなく、パスワードも忘れずに指定してください。
最後に
MySQL 8.0 からデフォルトの認証プラグインが caching_sha2_password に変更されました。 caching_sha2_password は 8.0 で新規に導入された認証方式であり、この認証を利用するには、サーバーとクライアントの双方が対応している必要があります。 レプリケーションも例外ではありません。
一方で Amazon RDS for MySQL 8.0 のデフォルトの認証プラグインは従来どおり mysql_native_password のため、5.* 系と同様に運用できます。
自前運用 MySQL 8.0 を RDS へ移行する際には、認証プラグインのデフォルト方式の違いにご注意ください。
それでは。